# -*- coding:utf-8 -*-
# title           :
# description     :
# author          :Python超人/三月三提供
# date            :2024-06-01
# link            :https://gitcode.net/pythoncr/
# python_version  :3.9
# ==============================================================================
import math

from 神笔码靓.神笔库.神笔绘图板 import 神笔绘图板
from 神笔码靓.神笔库.定义集 import *
from 神笔码靓.神笔库.配置 import *
from 神笔码靓.神笔库.通用工具集 import *


@dataclass
class 田字格字帖配置:
    标题: str = ""
    文字: str = "月"
    字体: str = 系统字体.隶书
    字体颜色: str = 颜色.灰色
    字格颜色: str = 颜色.深灰色
    文字辅助: bool = True
    字格样式: str = "2,2"
    字格宽度: float = 0.5
    字体大小: [float, int] = 52
    页边距: [float, int] = 50
    行数: int = 15
    列数: int = 10
    文字微调: tuple = (0, 0)
    描边宽度: float = 0.5
    描边样式: str = "1,1"


class 田字格字帖模板(神笔绘图板):
    def 计算数据(self):
        字帖配置: 田字格字帖配置 = self.获取配置项("字帖配置")
        文字 = 字帖配置.文字
        页边距 = 字帖配置.页边距
        行数 = 字帖配置.行数
        列数 = 字帖配置.列数

        标题 = 字帖配置.标题

        if 标题 == "" or 标题 is None:
            上边距 = 0
        else:
            上边距 = 30

        区域宽, 区域高 = self.宽 - 2 * 页边距, self.高 - 2 * 页边距 - 上边距
        # self.画矩形(x=页边距, y=页边距, 高=区域高, 宽=区域宽)

        田字格高度 = 区域高 / 行数
        田字格宽度 = 区域宽 / 列数

        田字格宽度 = 取最小数(田字格高度, 田字格宽度)

        区域宽, 区域高 = 田字格宽度 * 列数, 田字格宽度 * 行数

        左页边距 = (self.宽 - 区域宽) / 2

        练习的字数 = 行数 * 列数
        文字字数 = len(文字)
        if 文字字数 == 1:
            文字列表 = [文字] * 练习的字数
        else:
            每个字的个数 = math.ceil(练习的字数 / 文字字数)
            文字列表 = []
            for 字 in 文字:
                文字列表 += [字] * 每个字的个数

        起始点X, 起始点Y = 左页边距, 页边距 + 上边距
        结束点X, 结束点Y = 左页边距 + 区域宽, 页边距 + 上边距 + 区域高

        return 左页边距, 页边距, 上边距, 田字格宽度, 起始点X, 起始点Y, 结束点X, 结束点Y, 文字列表

    def 田字格(self):
        字帖配置: 田字格字帖配置 = self.获取配置项("字帖配置")
        文字 = 字帖配置.文字
        页边距 = 字帖配置.页边距
        行数 = 字帖配置.行数
        列数 = 字帖配置.列数
        标题 = 字帖配置.标题
        文字微调x, 文字微调y = 字帖配置.文字微调
        字体 = 字帖配置.字体
        字体大小 = 字帖配置.字体大小
        字体颜色 = 字帖配置.字体颜色
        文字辅助 = 字帖配置.文字辅助
        描边宽度 = 字帖配置.描边宽度
        描边样式 = 字帖配置.描边样式
        字格颜色 = 字帖配置.字格颜色
        字格宽度 = 字帖配置.字格宽度
        字格样式 = 字帖配置.字格样式

        左页边距, 页边距, 上边距, 田字格宽度, 起始点X, 起始点Y, 结束点X, 结束点Y, 文字列表 = self.计算数据()

        if 为空(标题):
            pass
        else:
            self.写字(self.宽 / 2, 50, 标题, 字体=字体, 字体大小=40, 描边宽度=0, 填充颜色=颜色.黑色)

        上一个字 = 无
        计数 = 0

        for row_num in range(行数):
            y = row_num * 田字格宽度 + 页边距 + 上边距
            for col_num in range(列数):
                x = col_num * 田字格宽度 + 左页边距
                _x, _y = x + 田字格宽度 / 2, y + 田字格宽度 / 2
                字 = 文字列表[计数]
                计数 = 计数 + 1
                if 上一个字 == 字:
                    if 文字辅助 and 不为空(字体):
                        if "," in 描边样式:
                            self.写字(_x + 文字微调x, _y + 文字微调y, 字, 字体=字体, 字体大小=字体大小, 描边宽度=描边宽度,
                                    描边颜色=字体颜色, 填充颜色=颜色.透明, 描边样式=描边样式)
                        else:
                            self.写字(_x + 文字微调x, _y + 文字微调y, 字, 字体=字体, 字体大小=字体大小, 描边宽度=0,
                                    描边颜色=颜色.透明, 填充颜色=字体颜色)
                else:
                    if 不为空(字体):
                        self.写字(_x + 文字微调x, _y + 文字微调y, 字, 字体=字体, 字体大小=字体大小, 描边宽度=0, 填充颜色=颜色.黑色)

                self.连直线([
                    ("M", _x - 田字格宽度 / 2, _y - 田字格宽度 / 2), (_x + 田字格宽度 / 2, _y + 田字格宽度 / 2),
                    ("M", _x + 田字格宽度 / 2, _y - 田字格宽度 / 2), (_x - 田字格宽度 / 2, _y + 田字格宽度 / 2),
                ], 描边宽度=字格宽度, 描边颜色=字格颜色,
                    描边样式=字格样式)

                self.画矩形(x=_x - 田字格宽度 / 4, y=_y - 田字格宽度 / 4, 宽=田字格宽度 / 2, 高=田字格宽度 / 2,
                         圆角半径=0,
                         描边宽度=字格宽度, 描边颜色=字格颜色,
                         描边样式=字格样式)

                上一个字 = 字

        self.画表格(x=起始点X, y=起始点Y, 列宽=田字格宽度, 行高=田字格宽度, 列数=列数, 行数=行数)
        self.画水平线(x1=起始点X, x2=结束点X, y1=起始点Y + 田字格宽度 / 2, y2=结束点Y - 田字格宽度 / 2,
                  描边宽度=字格宽度, 描边颜色=字格颜色, 数量=行数, 描边样式=字格样式)
        self.画垂直线(x1=起始点X + 田字格宽度 / 2, x2=结束点X - 田字格宽度 / 2, y1=起始点Y, y2=结束点Y,
                  描边宽度=字格宽度, 描边颜色=字格颜色, 数量=列数, 描边样式=字格样式)

    def 修改文件名(self, 原始文件名:str):
        字帖配置: 田字格字帖配置 = self.获取配置项("字帖配置")
        if 为空(字帖配置.字体):
            return "#后缀#", ""
        return "#后缀#", f"_{字帖配置.文字}_{系统字体.中文名(字帖配置.字体)}"

    def 创作(self):
        # 注意：图框不会显示到 PDF 文件中，如果不希望SVG文件显示图框，可以注释或者删除以下代码
        # self.显示图框()
        # self.显示网格(网格线距=20, 网格颜色=颜色.暗灰色, 网格透明度=1, 网格字体大小=9)

        self.田字格()


def 测试代码():
    # 作品文件路径：保存的 SVG（矢量图）格式的文件路径名称
    # 宽: 神笔绘图板也需要设置页面的宽度
    # 高: 神笔绘图板也需要设置页面的高度
    宽, 高 = 纸张大小.A4_纵向(1)

    字帖配置列表 = [
        # 田字格字帖配置(标题="毛笔字练习", 文字="床前明月光"),
        # 田字格字帖配置(文字="三", 字体=系统字体.华文琥珀, 字体大小=40, 字体颜色=颜色.红色),
        田字格字帖配置(字体="思雨手写行楷", 文字微调=(0, 12))
    ]

    for 字帖配置 in 字帖配置列表:
        田字格字帖 = 田字格字帖模板(作品文件路径="田字格字帖#后缀#.svg", 宽=宽, 高=高)
        田字格字帖.增加配置项("字帖配置", 字帖配置)
        田字格字帖.完成()
        田字格字帖.生成PDF()

